#import "event.h"
#import "eventSupplier.h"
#import "eventConsumer.h"
#import "listeningObject.h"

@class EventHandlerConsumer;
@class EventHandlerSupplier;
@class EventHandler;

/**
* @brief Clase encargada de manejar los eventos recibidos
* @author Carlos Rodriguez Dominguez
* 
* Subclase de EventConsumer que implementa los metodos virtuales
* "disconnect_push_consumer" y "push". Funcionara como event consumer
* propio para el manejador de eventos.
*/
@interface EventHandlerConsumer : EventConsumer {
	EventHandler* evh;
}

-(id) initWithCommunicator:(id<ICECommunicator>)communicator host:(NSString*)host handler:(EventHandler*)h;
-(void) push:(CollaborationMutableEvent *)evt current:(ICECurrent *)current;

@end

/**
* @brief Clase encargada de enviar eventos distribuidos (seran
*        recibidos por los event consumers en ejecucion)
* @author Carlos Rodriguez Dominguez
*
* Subclase de EventSupplier que implementa el metodo virtual
* "disconnect_push_supplier". Funcionara como event supplier
* propio para el manejador de eventos.
*/
@interface EventHandlerSupplier : EventSupplier {
	EventHandler* evh;
}

-(id) initWithCommunicator:(id<ICECommunicator>)communicator host:(NSString*)host handler:(EventHandler*)h;

@end

/**
* @brief Clase encargada de manejar eventos (envio y recepcion)
* @author Carlos Rodriguez Dominguez
* @date 13/11/2008
*
* Clase que permite registrar objetos, asi como enviar y recibir 
* eventos distribuidos. Para que se reciba un evento, debera haber
* registrado un objeto con un listener apropiado.
*/
@interface EventHandler : NSObject {
	id<ICECommunicator> comm;
	EventHandlerSupplier* channel_out; /**< Canal de salida para los eventos (event supplier) */
	EventHandlerConsumer* channel_input; /**< Canal de entrada para los eventos (event consumer) */
	NSMutableArray* objs; /**< Vector de objetos registrados */
}

-(id) initWithCommunicator:(id<ICECommunicator>)communicator andHost:(NSString*)h;
-(NSMutableArray*) objects;
-(void) push:(Event*)evt;
-(void) registerObject:(ListeningObject*)obj;
-(void) unregisterObject:(ListeningObject*)obj;
-(id<ICECommunicator>) communicator;
-(int) objectPosition:(ListeningObject*)obj;

@end
